package cn.walls1717.juc.future;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

/**
 * 获取值相关Api测试
 *
 * @author walls1717
 * @create 2022/12/09 15:44
 **/
@Slf4j
public class CompletableFutureApiDemo {

    public static void main(String[] args) {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "finished";
        });

        // 阻塞，直到成功获取到值。
        // log.info(future.get());

        // 阻塞指定时间，超过此时间仍没获取到值，抛出超时异常。
        // log.info(future.get(3, TimeUnit.SECONDS));

        // 与get()方法类似，最大的区别就是此方法不用在编译期处理异常。
        // log.info(future.join());

        // 这个方法执行的时候，线程仍然没有返回结果，就会立即返回指定的值。
        log.info(future.getNow("xxx"));

        /*
         * complete方法会判断线程是否被打断，如果执行到此方法，线程仍然没有返回，
         * 那么就会直接打断线程，将返回结果改为指定的值，并返回true；
         * 否则返回false，表示线程已经成功返回，没有被打断。
         */
        log.info(future.complete("complete") + future.join());
    }
}
